/*


!
!  Dalton, a molecular electronic structure program
!  Copyright (C) The Dalton Authors (see AUTHORS file for details).
!
!  This program is free software; you can redistribute it and/or
!  modify it under the terms of the GNU Lesser General Public
!  License version 2.1 as published by the Free Software Foundation.
!
!  This program is distributed in the hope that it will be useful,
!  but WITHOUT ANY WARRANTY; without even the implied warranty of
!  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
!  Lesser General Public License for more details.
!
!  If a copy of the GNU LGPL v2.1 was not distributed with this
!  code, you can obtain one at https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html.
!

!

*/
/*-*-mode: C; c-indentation-style: "bsd"; c-basic-offset: 4; -*-*/
/* fun-lrc95x.c:

   Automatically generated code implementing LRC95X functional and
   its derivatives. It is generated by func-codegen.pl being a part of
   a "Automatic code generation framework for analytical functional
   derivative evaluation", Pawel Salek, 2005

    This functional is connected by making following changes:
    1. add "extern Functional lrc95xFunctional;" to 'functionals.h'
    2. add "&lrc95xFunctional," to 'functionals.c'
    3. add "fun-lrc95x.c" to 'Makefile.am', 'Makefile.in' or 'Makefile'.

    This functional has been generated from following input:
    ------ cut here -------
rho:  rhoa + rhob;
grad: sqrt(grada*grada + gradb*gradb + 2*gradab);
zeta: (rhoa-rhob)/(rhoa+rhob);

Cx:    -3/4*(6/%PI)^(1/3);

a1:    0.8074;
a2:    0.5627;
a3:    0.1508;
a4:    100;
b2:    3/((3*%PI)^(1/3));

kfa:   (6*%PI^2*rhoa)^(1/3);
kfb:   (6*%PI^2*rhob)^(1/3);

sa:    grada/(2*kfa*rhoa);
sb:    gradb/(2*kfb*rhob);

F0a:   a2-a3*exp(-a4*sa^2)*sa^2;
F0b:   a2-a3*exp(-a4*sb^2)*sb^2;

F1a:   1+a2*b2*sa*asinh(a1*sa);
F1b:   1+a2*b2*sb*asinh(a1*sb);

Fa: F0a/F1a;
Fb: F0b/F1b;

Exa: -2^(1/3)*rhoa^(1/3)*(Cx+2*Fa);
Exb: -2^(1/3)*rhob^(1/3)*(Cx+2*Fb);

K(rhoa,rhob,grada,gradb,gradab):=(Exa+Exb);


    ------ cut here -------
*/

 
/* strictly conform to XOPEN ANSI C standard */
#if !defined(SYS_DEC)
/* XOPEN compliance is missing on old Tru64 4.0E Alphas and pow() prototype
 * is not specified. */
#define _XOPEN_SOURCE          500
#define _XOPEN_SOURCE_EXTENDED 1
#endif
#include <math.h>
#include <stddef.h>
#include "general.h"

#define __CVERSION__
 
#include "functionals.h"
 
/* INTERFACE PART */
static integer lrc95x_isgga(void) { return 1; } /* FIXME: detect! */
static integer lrc95x_read(const char *conf_line);
static real lrc95x_energy(const FunDensProp* dp);
static void lrc95x_first(FunFirstFuncDrv *ds,   real factor,
                         const FunDensProp* dp);
static void lrc95x_second(FunSecondFuncDrv *ds, real factor,
                          const FunDensProp* dp);
static void lrc95x_third(FunThirdFuncDrv *ds,   real factor,
                         const FunDensProp* dp);
static void lrc95x_fourth(FunFourthFuncDrv *ds,   real factor,
                          const FunDensProp* dp);
 
Functional LRC95xFunctional = {
  "LRC95x",       /* name */
  lrc95x_isgga,   /* gga-corrected */
   1,
  lrc95x_read,
  NULL,
  lrc95x_energy,
  lrc95x_first,
  lrc95x_second,
  lrc95x_third,
  lrc95x_fourth
};
 
/* IMPLEMENTATION PART */
static integer
lrc95x_read(const char *conf_line)
{
    fun_set_hf_weight(0);
    return 1;
}

static real
lrc95x_energy(const FunDensProp *dp)
{
    real res;
    real rhoa = dp->rhoa, rhob = dp->rhob;
    real grada = dp->grada, gradb = dp->gradb, gradab = dp->gradab;

    real t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
    real t11, t12, t13, t14, t15;

    t1 = pow(2.0,0.333333333333333);
    t2 = pow(6.0,0.333333333333333);
    t3 = -0.75*t2/pow(3.141592653589793,0.333333333333333);
    t4 = 1/
        pow(3.0,0.333333333333333);
    t5 = 1/t2;
    t6 = 0.318309886183791;
    t7 = 1/pow(3.141592653589793,0.666666666666667);
    t8 = 1/pow(rhoa,1.333333333333333);
    t9 = 1/pow(6.0,0.666666666666667);
    t10 = 1/pow(3.141592653589793,1.333333333333333);
    t11 = pow(grada,2.0);
    t12 = 1/pow(rhoa,2.666666666666667);
    t13 = 1/pow(rhob,1.333333333333333);
    t14 = pow(gradb,2.0);
    t15 = 1/pow(rhob,2.666666666666667);

   /* code */
    res = -1.0*t1*(2.0*(0.5627-0.0377*t10*t14*t15*t9/pow(2.718281828459045,
        25.0*t10*t14*t15*t9))/(0.84405*t4*t5*t6*gradb*asinh(0.4037*
        t5*t7*gradb*t13)*t13+1.0)+t3)*pow(rhob,0.333333333333333)-
        1.0*t1*(2.0*(0.5627-0.0377*t10*t11*t12*t9/pow(2.718281828459045,
        25.0*t10*t11*t12*t9))/(0.84405*t4*t5*t6*grada*asinh(0.4037*
        t5*t7*grada*t8)*t8+1.0)+t3)*pow(rhoa,0.333333333333333);

    return res;
}

static void
lrc95x_first_helper(real rhoa, real grada, real *res)
{    real t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
    real t11, t12, t13, t14, t15, t16, t17, t18;
    real t19, t20, t21;

    t1 = pow(2.0,0.333333333333333);
    t2 = pow(rhoa,0.333333333333333);
    t3 = 1/pow(3.0,0.333333333333333);
    t4 = pow(6.0,0.333333333333333);
    t5 = 1/t4;
    t6 = 0.318309886183791;
    t7 = 1/pow(rhoa,1.333333333333333);
    t8 = asinh(0.4037*t5*t7*grada/pow(3.141592653589793,0.666666666666667));
    t9 = 0.84405*
        t3*t5*t6*grada*t8*t7+1.0;
    t10 = 1/t9;
    t11 = 1/pow(3.141592653589793,2.666666666666667);
    t12 = 1/pow(6.0,0.666666666666667);
    t13 = 1/pow(3.141592653589793,1.333333333333333);
    t14 = pow(grada,2.0);
    t15 = 1/pow(rhoa,2.666666666666667);
    t16 = 1/pow(2.718281828459045,25.0*t12*t13*t14*t15);
    t17 = 1/
        pow(rhoa,3.666666666666667);
    t18 = 1/pow(3.141592653589793,1.666666666666667);
    t19 = 1/sqrt(0.16297369*t12*t13*t14*t15+1.0);
    t20 = 1/pow(t9,2.0);
    t21 = 0.5627-0.0377*t12*t13*t14*t15*t16;

   /* code */
    res[0] = -1.0*t1*t2*(2.0*t10*(0.100533333333333*t12*t13*
        t14*t17*t16-0.418888888888889*t11*t16*t5*pow(grada,4.0)/pow(rhoa,
        6.333333333333333))-2.0*t20*t21*(-1.1254*t3*t5*t6*t8*grada/
        pow(rhoa,2.333333333333333)-0.45432398*t3*t12*t18*t14*t19*
        t17))-0.333333333333333*t1*(2.0*t10*t21-0.75*t4/pow(3.141592653589793,
        0.333333333333333))/pow(rhoa,0.666666666666667);
    res[1] = -1.0*t1*t2*(2.0*t10*(0.314166666666667*t11*t16*
        t5*pow(grada,3.0)/pow(rhoa,5.333333333333333)-0.0754*t12*t13*
        grada*t15*t16)-2.0*t20*t21*(0.84405*t3*t5*t6*t8*t7+0.340742985*
        t3*t12*t18*grada*t19*t15));
}

static void
lrc95x_first(FunFirstFuncDrv *ds, real factor, const FunDensProp *dp)
{
    real res[2];

    lrc95x_first_helper(dp->rhoa, dp->grada, res);
   /* Final assignment */
    ds->df1000 += factor*res[0];
    ds->df0010 += factor*res[1];


    if(fabs(dp->rhoa-dp->rhob)>1e-13 ||
       fabs(dp->grada-dp->gradb)>1e-13)
        lrc95x_first_helper(dp->rhob, dp->gradb, res);
    ds->df0100 += factor*res[0];
    ds->df0001 += factor*res[1];

}

static void
lrc95x_second_helper(real rhoa, real grada, real *res)
{
    real t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
    real t11, t12, t13, t14, t15, t16, t17, t18;
    real t19, t20, t21, t22, t23, t24, t25, t26;
    real t27, t28, t29, t30, t31, t32, t33, t34;
    real t35, t36, t37, t38, t39, t40, t41;

    t1 = pow(2.0,0.333333333333333);
    t2 = pow(rhoa,0.333333333333333);
    t3 = 1/pow(3.0,0.333333333333333);
    t4 = pow(6.0,0.333333333333333);
    t5 = 1/t4;
    t6 = 0.318309886183791;
    t7 = 1/pow(rhoa,1.333333333333333);
    t8 = asinh(0.4037*t5*t7*grada/pow(3.141592653589793,0.666666666666667));
    t9 = 0.84405*
        t3*t5*t6*grada*t8*t7+1.0;
    t10 = 1/t9;
    t11 = 1/pow(3.141592653589793,2.666666666666667);
    t12 = pow(grada,4.0);
    t13 = 1/pow(rhoa,6.333333333333333);
    t14 = 1/pow(6.0,0.666666666666667);
    t15 = 1/pow(3.141592653589793,1.333333333333333);
    t16 = pow(grada,2.0);
    t17 = 1/pow(rhoa,2.666666666666667);
    t18 = 1/pow(2.718281828459045,25.0*t14*t15*t16*t17);
    t19 = 1/
        pow(rhoa,3.666666666666667);
    t20 = 0.100533333333333*t14*t15*t16*t19*t18-0.418888888888889*
        t5*t11*t12*t13*t18;
    t21 = 1/pow(3.141592653589793,1.666666666666667);
    t22 = sqrt(0.16297369*t14*t15*t16*t17+1.0);
    t23 = 1/t22;
    t24 = 1/pow(rhoa,2.333333333333333);
    t25 = -1.1254*t3*t5*t6*grada*t8*t24-0.45432398*t3*t14*
        t21*t16*t23*t19;
    t26 = 1/pow(t9,2.0);
    t27 = 0.5627-0.0377*t14*t15*t16*t17*t18;
    t28 = 2.0*t10*t20-2.0*t25*t26*t27;
    t29 = 1/pow(rhoa,0.666666666666667);
    t30 = 2.0*t10*t27-0.75*t4/pow(3.141592653589793,0.333333333333333);
    t31 = pow(grada,
        3.0);
    t32 = 1/pow(rhoa,5.333333333333333);
    t33 = 0.314166666666667*t5*t11*t31*t32*t18-0.0754*t14*
        t15*grada*t17*t18;
    t34 = 0.84405*t3*t5*t6*t8*t7+0.340742985*t3*t14*t21*grada*
        t23*t17;
    t35 = 2.0*t10*t33-2.0*t26*t27*t34;
    t36 = 1/pow(3.141592653589793,4.0);
    t37 = 1/pow(rhoa,7.333333333333333);
    t38 = 1/pow(rhoa,4.666666666666667);
    t39 = 1/pow(t9,3.0);
    t40 = 1/pow(3.141592653589793,3.0);
    t41 = 1/pow(t22,3.0);

   /* code */
    res[0] = -0.333333333333333*t1*t29*t30-1.0*t1*t2*t28;
    res[1] = -1.0*t1*t2*t35;
    res[2] = -1.0*t1*t2*(2.0*t10*(-4.65432098765432*t18*t36*
        pow(grada,6.0)/pow(rhoa,10.0)-0.368622222222222*t14*t15*t16*
        t38*t18+3.77*t5*t11*t12*t37*t18)-2.0*t26*t27*(2.625933333333333*
        t3*t5*t6*t8*grada/pow(rhoa,3.333333333333333)+2.2716199*t3*
        t14*t21*t16*t23*t38-0.016453967883575*t3*t5*t40*t12*t41*t37)+
        4.0*pow(t25,2.0)*t27*t39-4.0*t20*t25*t26)+0.222222222222222*
        t1*t30/pow(rhoa,1.666666666666667)-0.666666666666667*t1*t28*
        t29;
    res[3] = -1.0*t1*t2*(2.0*t10*(3.490740740740741*t18*t36*
        pow(grada,5.0)/pow(rhoa,9.0)+0.201066666666667*t14*t15*grada*
        t19*t18-2.513333333333333*t5*t11*t31*t13*t18)+4.0*t25*t27*
        t34*t39-2.0*t20*t26*t34-2.0*t25*t26*t33-2.0*(-1.1254*t3*t5*
        t6*t8*t24-1.36297194*t3*t14*t21*grada*t23*t19+0.012340475912681*
        t3*t5*t40*t31*t41*t13)*t26*t27)-0.333333333333333*t1*t29*t35;
    res[4] = -1.0*t1*t2*(2.0*t10*(-2.618055555555556*t12*
        t18*t36/pow(rhoa,8.0)+1.570833333333333*t5*t11*t16*t32*t18-
        0.0754*t14*t15*t17*t18)+4.0*t27*pow(t34,2.0)*t39-4.0*t26*t33*
        t34-2.0*(0.68148597*t3*t14*t21*t23*t17-0.009255356934511*t3*
        t5*t40*t16*t41*t32)*t26*t27);

}

static void
lrc95x_second(FunSecondFuncDrv *ds, real factor, const FunDensProp* dp)
{
    real res[5];
 
    lrc95x_second_helper(dp->rhoa, dp->grada, res);

    ds->df1000 += factor*res[0];
    ds->df0010 += factor*res[1];

    ds->df2000 += factor*res[2];
    ds->df1010 += factor*res[3];
    ds->df0020 += factor*res[4];


    if(fabs(dp->rhoa-dp->rhob)>1e-13 ||
       fabs(dp->grada-dp->gradb)>1e-13)
        lrc95x_second_helper(dp->rhob, dp->gradb, res);
    ds->df0100 += factor*res[0];
    ds->df0001 += factor*res[1];

    ds->df0200 += factor*res[2];
    ds->df0101 += factor*res[3];
    ds->df0002 += factor*res[4];

}

static void
lrc95x_third_helper(real rhoa, real grada, real *res)
{
    real t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
    real t11, t12, t13, t14, t15, t16, t17, t18;
    real t19, t20, t21, t22, t23, t24, t25, t26;
    real t27, t28, t29, t30, t31, t32, t33, t34;
    real t35, t36, t37, t38, t39, t40, t41, t42;
    real t43, t44, t45, t46, t47, t48, t49, t50;
    real t51, t52, t53, t54, t55, t56, t57, t58;
    real t59, t60, t61, t62, t63, t64, t65, t66;

    t1 = pow(2.0,0.333333333333333);
    t2 = pow(rhoa,0.333333333333333);
    t3 = 1/pow(3.0,0.333333333333333);
    t4 = pow(6.0,0.333333333333333);
    t5 = 1/t4;
    t6 = 0.318309886183791;
    t7 = 1/pow(rhoa,1.333333333333333);
    t8 = asinh(0.4037*t5*t7*grada/pow(3.141592653589793,0.666666666666667));
    t9 = 0.84405*
        t3*t5*t6*grada*t8*t7+1.0;
    t10 = 1/t9;
    t11 = 1/pow(3.141592653589793,2.666666666666667);
    t12 = pow(grada,4.0);
    t13 = 1/pow(rhoa,6.333333333333333);
    t14 = 1/pow(6.0,0.666666666666667);
    t15 = 1/pow(3.141592653589793,1.333333333333333);
    t16 = pow(grada,2.0);
    t17 = 1/pow(rhoa,2.666666666666667);
    t18 = 1/pow(2.718281828459045,25.0*t14*t15*t16*t17);
    t19 = 1/
        pow(rhoa,3.666666666666667);
    t20 = 0.100533333333333*t14*t15*t16*t19*t18-0.418888888888889*
        t5*t11*t12*t13*t18;
    t21 = 1/pow(3.141592653589793,1.666666666666667);
    t22 = sqrt(0.16297369*t14*t15*t16*t17+1.0);
    t23 = 1/t22;
    t24 = 1/pow(rhoa,2.333333333333333);
    t25 = -1.1254*t3*t5*t6*grada*t8*t24-0.45432398*t3*t14*
        t21*t16*t23*t19;
    t26 = 1/pow(t9,2.0);
    t27 = 0.5627-0.0377*t14*t15*t16*t17*t18;
    t28 = 2.0*t10*t20-2.0*t25*t26*t27;
    t29 = 1/pow(rhoa,0.666666666666667);
    t30 = 2.0*t10*t27-0.75*t4/pow(3.141592653589793,0.333333333333333);
    t31 = pow(grada,
        3.0);
    t32 = 1/pow(rhoa,5.333333333333333);
    t33 = 0.314166666666667*t5*t11*t31*t32*t18-0.0754*t14*
        t15*grada*t17*t18;
    t34 = 0.84405*t3*t5*t6*t8*t7+0.340742985*t3*t14*t21*grada*
        t23*t17;
    t35 = 2.0*t10*t33-2.0*t26*t27*t34;
    t36 = 1/pow(3.141592653589793,4.0);
    t37 = pow(grada,6.0);
    t38 = 1/pow(rhoa,10.0);
    t39 = 1/pow(rhoa,7.333333333333333);
    t40 = 1/pow(rhoa,4.666666666666667);
    t41 = -0.368622222222222*t14*t15*t16*t40*t18+3.77*t5*
        t11*t12*t39*t18-4.65432098765432*t36*t37*t38*t18;
    t42 = pow(t25,2.0);
    t43 = 1/pow(t9,3.0);
    t44 = 1/pow(3.141592653589793,3.0);
    t45 = 1/pow(t22,3.0);
    t46 = 1/pow(rhoa,3.333333333333333);
    t47 = 2.625933333333333*t3*t5*t6*grada*t8*t46+2.2716199*
        t3*t14*t21*t16*t23*t40-0.016453967883575*t3*t5*t44*t12*t45*
        t39;
    t48 = -2.0*t26*t27*t47+4.0*t27*t42*t43+2.0*t10*t41-4.0*
        t20*t25*t26;
    t49 = 1/pow(rhoa,1.666666666666667);
    t50 = pow(grada,5.0);
    t51 = 1/pow(rhoa,9.0);
    t52 = 0.201066666666667*t14*t15*grada*t19*t18-2.513333333333333*
        t5*t11*t31*t13*t18+3.490740740740741*t36*t50*t51*t18;
    t53 = -1.1254*t3*t5*t6*t8*t24-1.36297194*t3*t14*t21*grada*
        t23*t19+0.012340475912681*t3*t5*t44*t31*t45*t13;
    t54 = -2.0*t26*t27*t53+2.0*t10*t52+4.0*t25*t27*t34*t43-
        2.0*t20*t26*t34-2.0*t25*t26*t33;
    t55 = 1/pow(rhoa,8.0);
    t56 = -0.0754*t14*t15*t17*t18+1.570833333333333*t5*t11*
        t16*t32*t18-2.618055555555556*t36*t12*t55*t18;
    t57 = pow(t34,2.0);
    t58 = 0.68148597*t3*t14*t21*t23*t17-0.009255356934511*
        t3*t5*t44*t16*t45*t32;
    t59 = -2.0*t26*t27*t58+4.0*t27*t43*t57+2.0*t10*t56-4.0*
        t26*t33*t34;
    t60 = 1/pow(3.141592653589793,5.333333333333333);
    t61 = 1/pow(rhoa,11.0);
    t62 = 1/pow(rhoa,8.333333333333334);
    t63 = 1/pow(rhoa,5.666666666666667);
    t64 = 1/pow(t9,4.0);
    t65 = 1/pow(3.141592653589793,4.333333333333333);
    t66 = 1/pow(t22,5.0);

   /* code */
    res[0] = -0.333333333333333*t1*t29*t30-1.0*t1*t2*t28;
    res[1] = -1.0*t1*t2*t35;
    res[2] = 0.222222222222222*t1*t30*t49-1.0*t1*t2*t48-0.666666666666667*
        t1*t28*t29;
    res[3] = -1.0*t1*t2*t54-0.333333333333333*t1*t29*t35;
    res[4] = -1.0*t1*t2*t59;
    res[5] = -1.0*t1*t2*(2.0*t10*(-310.2880658436214*t14*
        t18*t60*pow(grada,8.0)/pow(rhoa,13.66666666666667)+1.720237037037037*
        t14*t15*t16*t63*t18-31.74246913580246*t5*t11*t12*t62*t18+88.43209876543209*
        t36*t37*t61*t18)-2.0*t26*t27*(-8.753111111111112*t3*t5*t6*
        t8*grada/pow(rhoa,4.333333333333333)-12.01434524888889*t3*
        t14*t21*t16*t23*t63+0.202932270564088*t3*t5*t44*t12*t45*t62-
        0.001787709240752*t3*t65*t37*t66*t61)-12.0*pow(t25,3.0)*t27*
        t64+12.0*t25*t27*t43*t47-6.0*t20*t26*t47+12.0*t20*t42*t43-
        6.0*t25*t26*t41)+0.666666666666667*t1*t28*t49-1.0*t1*t29*t48-
        0.37037037037037*t1*t17*t30;
    res[6] = -1.0*t1*t2*(2.0*t10*(232.716049382716*t14*t18*
        t60*pow(grada,7.0)/pow(rhoa,12.66666666666667)-0.737244444444444*
        t14*t15*grada*t40*t18+18.15185185185185*t5*t11*t31*t39*t18-
        59.34259259259259*t36*t50*t38*t18)-12.0*t27*t34*t42*t64+8.0*
        t25*t27*t43*t53-4.0*t20*t26*t53-4.0*t25*t26*t52+4.0*t27*t34*
        t43*t47-2.0*t26*t33*t47-2.0*t26*t27*(2.625933333333333*t3*
        t5*t6*t8*t46+5.603329086666666*t3*t14*t21*grada*t23*t40-0.127518251097704*
        t3*t5*t44*t31*t45*t39+0.001340781930564*t3*t65*t50*t66*t38)+
        4.0*t33*t42*t43+8.0*t20*t25*t34*t43-2.0*t26*t34*t41)-0.666666666666667*
        t1*t29*t54+0.222222222222222*t1*t35*t49;
    res[7] = -1.0*t1*t2*(2.0*t10*(-174.537037037037*t14*t18*
        t37*t60/pow(rhoa,11.66666666666667)+38.39814814814815*t36*
        t12*t51*t18+0.201066666666667*t14*t15*t19*t18-9.215555555555554*
        t5*t11*t16*t13*t18)-12.0*t25*t27*t57*t64+4.0*t25*t27*t43*t58-
        2.0*t20*t26*t58+4.0*t20*t43*t57-2.0*t25*t26*t56+8.0*t27*t34*
        t43*t53-4.0*t26*t33*t53-4.0*t26*t34*t52+8.0*t25*t33*t34*t43-
        2.0*(-1.81729592*t3*t14*t21*t23*t19+0.074042855476086*t3*t5*
        t44*t16*t45*t13-0.001005586447923*t3*t65*t12*t66*t51)*t26*
        t27)-0.333333333333333*t1*t29*t59;
    res[8] = -1.0*t1*t2*(2.0*t10*(130.9027777777778*t14*t18*
        t50*t60/pow(rhoa,10.66666666666667)-23.5625*t36*t31*t55*t18+
        3.77*t5*t11*grada*t32*t18)-12.0*t27*pow(t34,3.0)*t64+12.0*
        t27*t34*t43*t58-6.0*t26*t33*t58+12.0*t33*t43*t57-6.0*t26*t34*
        t56-2.0*t26*t27*(7.541898359421547E-4*t3*t65*t31*t66*t55-0.037021427738043*
        t3*t5*t44*grada*t45*t32));

}

static void
lrc95x_third(FunThirdFuncDrv *ds, real factor, const FunDensProp* dp)
{
    real res[9];
 
    lrc95x_third_helper(dp->rhoa, dp->grada, res);

    ds->df1000 += factor*res[0];
    ds->df0010 += factor*res[1];

    ds->df2000 += factor*res[2];
    ds->df1010 += factor*res[3];
    ds->df0020 += factor*res[4];

    ds->df3000 += factor*res[5];
    ds->df2010 += factor*res[6];
    ds->df1020 += factor*res[7];
    ds->df0030 += factor*res[8];


    if(fabs(dp->rhoa-dp->rhob)>1e-13 ||
       fabs(dp->grada-dp->gradb)>1e-13)
        lrc95x_third_helper(dp->rhob, dp->gradb, res);

    ds->df0100 += factor*res[0];
    ds->df0001 += factor*res[1];

    ds->df0200 += factor*res[2];
    ds->df0101 += factor*res[3];
    ds->df0002 += factor*res[4];

    ds->df0300 += factor*res[5];
    ds->df0201 += factor*res[6];
    ds->df0102 += factor*res[7];
    ds->df0003 += factor*res[8];

}

static void
lrc95x_fourth_helper(real rhoa, real grada, real *res)
{
    real t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
    real t11, t12, t13, t14, t15, t16, t17, t18;
    real t19, t20, t21, t22, t23, t24, t25, t26;
    real t27, t28, t29, t30, t31, t32, t33, t34;
    real t35, t36, t37, t38, t39, t40, t41, t42;
    real t43, t44, t45, t46, t47, t48, t49, t50;
    real t51, t52, t53, t54, t55, t56, t57, t58;
    real t59, t60, t61, t62, t63, t64, t65, t66;
    real t67, t68, t69, t70, t71, t72, t73, t74;
    real t75, t76, t77, t78, t79, t80, t81, t82;
    real t83, t84, t85, t86, t87, t88, t89, t90;
    real t91, t92, t93, t94, t95;

    t1 = pow(2.0,0.333333333333333);
    t2 = pow(rhoa,0.333333333333333);
    t3 = 1/pow(3.0,0.333333333333333);
    t4 = pow(6.0,0.333333333333333);
    t5 = 1/t4;
    t6 = 0.318309886183791;
    t7 = 1/pow(rhoa,1.333333333333333);
    t8 = asinh(0.4037*t5*t7*grada/pow(3.141592653589793,0.666666666666667));
    t9 = 0.84405*
        t3*t5*t6*grada*t8*t7+1.0;
    t10 = 1/t9;
    t11 = 1/pow(3.141592653589793,2.666666666666667);
    t12 = pow(grada,4.0);
    t13 = 1/pow(rhoa,6.333333333333333);
    t14 = 1/pow(6.0,0.666666666666667);
    t15 = 1/pow(3.141592653589793,1.333333333333333);
    t16 = pow(grada,2.0);
    t17 = 1/pow(rhoa,2.666666666666667);
    t18 = 1/pow(2.718281828459045,25.0*t14*t15*t16*t17);
    t19 = 1/
        pow(rhoa,3.666666666666667);
    t20 = 0.100533333333333*t14*t15*t16*t19*t18-0.418888888888889*
        t5*t11*t12*t13*t18;
    t21 = 1/pow(3.141592653589793,1.666666666666667);
    t22 = sqrt(0.16297369*t14*t15*t16*t17+1.0);
    t23 = 1/t22;
    t24 = 1/pow(rhoa,2.333333333333333);
    t25 = -1.1254*t3*t5*t6*grada*t8*t24-0.45432398*t3*t14*
        t21*t16*t23*t19;
    t26 = 1/pow(t9,2.0);
    t27 = 0.5627-0.0377*t14*t15*t16*t17*t18;
    t28 = 2.0*t10*t20-2.0*t25*t26*t27;
    t29 = 1/pow(rhoa,0.666666666666667);
    t30 = 2.0*t10*t27-0.75*t4/pow(3.141592653589793,0.333333333333333);
    t31 = pow(grada,
        3.0);
    t32 = 1/pow(rhoa,5.333333333333333);
    t33 = 0.314166666666667*t5*t11*t31*t32*t18-0.0754*t14*
        t15*grada*t17*t18;
    t34 = 0.84405*t3*t5*t6*t8*t7+0.340742985*t3*t14*t21*grada*
        t23*t17;
    t35 = 2.0*t10*t33-2.0*t26*t27*t34;
    t36 = 1/pow(3.141592653589793,4.0);
    t37 = pow(grada,6.0);
    t38 = 1/pow(rhoa,10.0);
    t39 = 1/pow(rhoa,7.333333333333333);
    t40 = 1/pow(rhoa,4.666666666666667);
    t41 = -0.368622222222222*t14*t15*t16*t40*t18+3.77*t5*
        t11*t12*t39*t18-4.65432098765432*t36*t37*t38*t18;
    t42 = pow(t25,2.0);
    t43 = 1/pow(t9,3.0);
    t44 = 1/pow(3.141592653589793,3.0);
    t45 = 1/pow(t22,3.0);
    t46 = 1/pow(rhoa,3.333333333333333);
    t47 = 2.625933333333333*t3*t5*t6*grada*t8*t46+2.2716199*
        t3*t14*t21*t16*t23*t40-0.016453967883575*t3*t5*t44*t12*t45*
        t39;
    t48 = -2.0*t26*t27*t47+4.0*t27*t42*t43+2.0*t10*t41-4.0*
        t20*t25*t26;
    t49 = 1/pow(rhoa,1.666666666666667);
    t50 = pow(grada,5.0);
    t51 = 1/pow(rhoa,9.0);
    t52 = 0.201066666666667*t14*t15*grada*t19*t18-2.513333333333333*
        t5*t11*t31*t13*t18+3.490740740740741*t36*t50*t51*t18;
    t53 = -1.1254*t3*t5*t6*t8*t24-1.36297194*t3*t14*t21*grada*
        t23*t19+0.012340475912681*t3*t5*t44*t31*t45*t13;
    t54 = -2.0*t26*t27*t53+2.0*t10*t52+4.0*t25*t27*t34*t43-
        2.0*t20*t26*t34-2.0*t25*t26*t33;
    t55 = 1/pow(rhoa,8.0);
    t56 = -0.0754*t14*t15*t17*t18+1.570833333333333*t5*t11*
        t16*t32*t18-2.618055555555556*t36*t12*t55*t18;
    t57 = pow(t34,2.0);
    t58 = 0.68148597*t3*t14*t21*t23*t17-0.009255356934511*
        t3*t5*t44*t16*t45*t32;
    t59 = -2.0*t26*t27*t58+4.0*t27*t43*t57+2.0*t10*t56-4.0*
        t26*t33*t34;
    t60 = 1/pow(3.141592653589793,5.333333333333333);
    t61 = pow(grada,8.0);
    t62 = 1/pow(rhoa,13.66666666666667);
    t63 = 1/pow(rhoa,11.0);
    t64 = 1/pow(rhoa,8.333333333333334);
    t65 = 1/pow(rhoa,5.666666666666667);
    t66 = 1.720237037037037*t14*t15*t16*t65*t18-31.74246913580246*
        t5*t11*t12*t64*t18+88.43209876543209*t36*t37*t63*t18-310.2880658436214*
        t14*t60*t61*t62*t18;
    t67 = pow(t25,3.0);
    t68 = 1/pow(t9,4.0);
    t69 = 1/pow(3.141592653589793,4.333333333333333);
    t70 = 1/pow(t22,5.0);
    t71 = 1/pow(rhoa,4.333333333333333);
    t72 = -8.753111111111112*t3*t5*t6*grada*t8*t71-12.01434524888889*
        t3*t14*t21*t16*t23*t65+0.202932270564088*t3*t5*t44*t12*t45*
        t64-0.001787709240752*t3*t69*t37*t70*t63;
    t73 = -2.0*t26*t27*t72-12.0*t27*t67*t68+2.0*t10*t66+12.0*
        t25*t27*t43*t47-6.0*t20*t26*t47+12.0*t20*t42*t43-6.0*t25*t26*
        t41;
    t74 = pow(grada,7.0);
    t75 = 1/pow(rhoa,12.66666666666667);
    t76 = -0.737244444444444*t14*t15*grada*t40*t18+18.15185185185185*
        t5*t11*t31*t39*t18-59.34259259259259*t36*t50*t38*t18+232.716049382716*
        t14*t60*t74*t75*t18;
    t77 = 2.625933333333333*t3*t5*t6*t8*t46+5.603329086666666*
        t3*t14*t21*grada*t23*t40-0.127518251097704*t3*t5*t44*t31*t45*
        t39+0.001340781930564*t3*t69*t50*t70*t38;
    t78 = -2.0*t26*t27*t77+2.0*t10*t76-12.0*t27*t34*t42*t68+
        8.0*t25*t27*t43*t53-4.0*t20*t26*t53-4.0*t25*t26*t52+4.0*t27*
        t34*t43*t47-2.0*t26*t33*t47+4.0*t33*t42*t43+8.0*t20*t25*t34*
        t43-2.0*t26*t34*t41;
    t79 = 1/pow(rhoa,11.66666666666667);
    t80 = 0.201066666666667*t14*t15*t19*t18-9.215555555555554*
        t5*t11*t16*t13*t18+38.39814814814815*t36*t12*t51*t18-174.537037037037*
        t14*t60*t37*t79*t18;
    t81 = -1.81729592*t3*t14*t21*t23*t19+0.074042855476086*
        t3*t5*t44*t16*t45*t13-0.001005586447923*t3*t69*t12*t70*t51;
    t82 = -
        2.0*t26*t27*t81+2.0*t10*t80-12.0*t25*t27*t57*t68+4.0*t25*t27*
        t43*t58-2.0*t20*t26*t58+4.0*t20*t43*t57-2.0*t25*t26*t56+8.0*
        t27*t34*t43*t53-4.0*t26*t33*t53-4.0*t26*t34*t52+8.0*t25*t33*
        t34*t43;
    t83 = 1/pow(rhoa,10.66666666666667);
    t84 = 3.77*t5*t11*grada*t32*t18-23.5625*t36*t31*t55*t18+
        130.9027777777778*t14*t60*t50*t83*t18;
    t85 = pow(t34,3.0);
    t86 = 7.541898359421547E-4*t3*t69*t31*t70*t55-0.037021427738043*
        t3*t5*t44*grada*t45*t32;
    t87 = -2.0*t26*t27*t86-12.0*t27*t68*t85+2.0*t10*t84+12.0*
        t27*t34*t43*t58-6.0*t26*t33*t58+12.0*t33*t43*t57-6.0*t26*t34*
        t56;
    t88 = 1/pow(3.141592653589793,6.666666666666667);
    t89 = 1/pow(rhoa,14.66666666666667);
    t90 = 1/pow(rhoa,12.0);
    t91 = 1/pow(rhoa,9.333333333333334);
    t92 = 1/pow(rhoa,6.666666666666667);
    t93 = 1/pow(t9,5.0);
    t94 = 1/pow(3.141592653589793,5.666666666666667);
    t95 = 1/pow(t22,7.0);

   /* code */
    res[0] = -0.333333333333333*t1*t29*t30-1.0*t1*t2*t28;
    res[1] = -1.0*t1*t2*t35;
    res[2] = 0.222222222222222*t1*t30*t49-1.0*t1*t2*t48-0.666666666666667*
        t1*t28*t29;
    res[3] = -1.0*t1*t2*t54-0.333333333333333*t1*t29*t35;
    res[4] = -1.0*t1*t2*t59;
    res[5] = -1.0*t1*t2*t73+0.666666666666667*t1*t28*t49-
        1.0*t1*t29*t48-0.37037037037037*t1*t17*t30;
    res[6] = -1.0*t1*t2*t78-0.666666666666667*t1*t29*t54+
        0.222222222222222*t1*t35*t49;
    res[7] = -1.0*t1*t2*t82-0.333333333333333*t1*t29*t59;
    res[8] = -1.0*t1*t2*t87;
    res[9] = -1.0*t1*t2*(2.0*t10*(-3447.645176040237*t18*
        t5*t88*pow(grada,10.0)/pow(rhoa,17.33333333333333)-9.748009876543211*
        t14*t15*t16*t92*t18+283.6343209876543*t5*t11*t12*t91*t18-1325.447187928669*
        t36*t37*t90*t18+10136.0768175583*t14*t60*t61*t89*t18)+48.0*
        pow(t25,4.0)*t27*t93+16.0*t25*t27*t43*t72-8.0*t20*t26*t72-
        48.0*t20*t67*t68-72.0*t27*t42*t47*t68-8.0*t25*t26*t66+12.0*
        t27*t43*pow(t47,2.0)+48.0*t20*t25*t43*t47-12.0*t26*t41*t47+
        24.0*t41*t42*t43-2.0*t26*t27*(37.93014814814815*t3*t5*t6*grada*
        t8*t32+72.79279768444444*t3*t14*t21*t16*t23*t92-2.126218294288599*
        t3*t5*t44*t12*t45*t91+0.041713215617541*t3*t69*t37*t70*t90-
        0.001942330477416*t3*t14*t94*t61*t95*t89))-1.333333333333333*
        t1*t29*t73+1.333333333333333*t1*t48*t49+0.987654320987654*
        t1*t19*t30-1.481481481481481*t1*t17*t28;
    res[10] = -1.0*t1*t2*(2.0*t10*(2585.733882030178*t18*
        t5*t88*pow(grada,9.0)/pow(rhoa,16.33333333333333)+3.440474074074074*
        t14*t15*grada*t65*t18-141.3051851851852*t5*t11*t31*t64*t18+
        795.1131687242797*t36*t50*t63*t18-6903.909465020575*t14*t60*
        t74*t62*t18)+48.0*t27*t34*t67*t93+12.0*t25*t27*t43*t77-6.0*
        t20*t26*t77-6.0*t25*t26*t76+4.0*t27*t34*t43*t72-2.0*t26*t33*
        t72-2.0*t26*t27*(-8.753111111111112*t3*t5*t6*t8*t71-27.56232145333333*
        t3*t14*t21*grada*t23*t65+1.138066111947251*t3*t5*t44*t31*t45*
        t64-0.027262565921465*t3*t69*t50*t70*t63+0.001456747858062*
        t3*t14*t94*t74*t95*t62)-12.0*t33*t67*t68-36.0*t27*t42*t53*
        t68-36.0*t25*t27*t34*t47*t68-36.0*t20*t34*t42*t68-2.0*t26*
        t34*t66+12.0*t27*t43*t47*t53+24.0*t20*t25*t43*t53-6.0*t26*
        t41*t53-6.0*t26*t47*t52+12.0*t42*t43*t52+12.0*t20*t34*t43*
        t47+12.0*t25*t33*t43*t47+12.0*t25*t34*t41*t43)-1.0*t1*t29*
        t78+0.666666666666667*t1*t49*t54-0.37037037037037*t1*t17*t35;
    res[11] = -1.0*t1*t2*(2.0*t10*(-1939.300411522634*t18*
        t5*t61*t88/pow(rhoa,15.33333333333333)+4596.141975308642*t14*
        t60*t37*t75*t18-0.737244444444444*t14*t15*t40*t18+60.59925925925926*
        t5*t11*t16*t39*t18-447.9783950617284*t36*t12*t38*t18)+48.0*
        t27*t42*t57*t93+8.0*t25*t27*t43*t81-4.0*t20*t26*t81-4.0*t25*
        t26*t80+8.0*t27*t34*t43*t77-4.0*t26*t33*t77-4.0*t26*t34*t76-
        12.0*t27*t42*t58*t68-12.0*t27*t47*t57*t68-24.0*t20*t25*t57*
        t68-48.0*t25*t27*t34*t53*t68-24.0*t33*t34*t42*t68+4.0*t27*
        t43*t47*t58+8.0*t20*t25*t43*t58-2.0*t26*t41*t58+4.0*t41*t43*
        t57-2.0*t26*t47*t56+4.0*t42*t43*t56+8.0*t27*t43*pow(t53,2.0)-
        8.0*t26*t52*t53+16.0*t20*t34*t43*t53+16.0*t25*t33*t43*t53+
        16.0*t25*t34*t43*t52+8.0*t33*t34*t43*t47-2.0*t26*t27*(6.663418373333333*
        t3*t14*t21*t23*t40-0.534753956216178*t3*t5*t44*t16*t45*t39+
        0.017094969614689*t3*t69*t12*t70*t38-0.001092560893547*t3*
        t14*t94*t37*t95*t75))-0.666666666666667*t1*t29*t82+0.222222222222222*
        t1*t49*t59;
    res[12] = -1.0*t1*t2*(2.0*t10*(1454.475308641976*t18*
        t5*t74*t88/pow(rhoa,14.33333333333333)-2967.12962962963*t14*
        t60*t50*t79*t18+230.3888888888889*t36*t31*t51*t18-20.10666666666666*
        t5*t11*grada*t13*t18)+48.0*t25*t27*t85*t93+4.0*t25*t27*t43*
        t86-2.0*t20*t26*t86-12.0*t20*t68*t85-2.0*t25*t26*t84+12.0*
        t27*t34*t43*t81-6.0*t26*t33*t81-6.0*t26*t34*t80-36.0*t25*t27*
        t34*t58*t68-36.0*t27*t53*t57*t68-36.0*t25*t33*t57*t68+12.0*
        t27*t43*t53*t58-6.0*t26*t52*t58+12.0*t20*t34*t43*t58+12.0*
        t25*t33*t43*t58+12.0*t43*t52*t57-6.0*t26*t53*t56+12.0*t25*
        t34*t43*t56+24.0*t33*t34*t43*t53-2.0*(0.197447614602897*t3*
        t5*t44*grada*t45*t13-0.010055864479229*t3*t69*t31*t70*t51+
        8.194206701599171E-4*t3*t14*t94*t50*t95*t79)*t26*t27)-0.333333333333333*
        t1*t29*t87;
    res[13] = -1.0*t1*t2*(2.0*t10*(-1090.856481481482*t18*
        t37*t5*t88/pow(rhoa,13.33333333333333)+1832.638888888889*t14*
        t60*t12*t83*t18-102.1041666666667*t36*t16*t55*t18+3.77*t5*
        t11*t32*t18)+48.0*t27*pow(t34,4.0)*t93+16.0*t27*t34*t43*t86-
        8.0*t26*t33*t86-48.0*t33*t68*t85-8.0*t26*t34*t84-72.0*t27*
        t57*t58*t68+12.0*t27*t43*pow(t58,2.0)-12.0*t26*t56*t58+48.0*
        t33*t34*t43*t58+24.0*t43*t56*t57-2.0*t26*t27*(-0.037021427738043*
        t3*t5*t44*t45*t32+0.005279328851595*t3*t69*t16*t70*t55-6.145655026199379E-4*
        t3*t14*t94*t12*t95*t83));

}

static void
lrc95x_fourth(FunFourthFuncDrv *ds, real factor, const FunDensProp* dp)
{
    real res[14];
 
    lrc95x_fourth_helper(dp->rhoa, dp->grada, res);

    ds->df1000 += factor*res[0];
    ds->df0010 += factor*res[1];

    ds->df2000 += factor*res[2];
    ds->df1010 += factor*res[3];
    ds->df0020 += factor*res[4];

    ds->df3000 += factor*res[5];
    ds->df2010 += factor*res[6];
    ds->df1020 += factor*res[7];
    ds->df0030 += factor*res[8];

    ds->df4000 += factor*res[9];
    ds->df3010 += factor*res[10];
    ds->df2020 += factor*res[11];
    ds->df1030 += factor*res[12];
    ds->df0040 += factor*res[13];


    if(fabs(dp->rhoa-dp->rhob)>1e-13 ||
       fabs(dp->grada-dp->gradb)>1e-13)
        lrc95x_fourth_helper(dp->rhob, dp->gradb, res);

    ds->df0100 += factor*res[0];
    ds->df0001 += factor*res[1];

    ds->df0200 += factor*res[2];
    ds->df0101 += factor*res[3];
    ds->df0002 += factor*res[4];

    ds->df0300 += factor*res[5];
    ds->df0201 += factor*res[6];
    ds->df0102 += factor*res[7];
    ds->df0003 += factor*res[8];

    ds->df0400 += factor*res[9];
    ds->df0301 += factor*res[10];
    ds->df0202 += factor*res[11];
    ds->df0103 += factor*res[12];
    ds->df0004 += factor*res[13];

}
